/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.faesa.acervo.business.ejb;

import br.faesa.acervo.entity.Livro;
import br.faesa.acervo.entity.LivroTipo;
import br.faesa.acervo.entity.Usuario;
import br.faesa.acervo.exception.DataAccessException;
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

/**
 *
 * @author aluno.faesa
 */
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class CadastroBasicoSessionBean implements CadastroBasicoSessionBeanLocal {

    @Resource
    private UserTransaction ut;

    @PersistenceContext
    private EntityManager em;

    @Override
    public void salvarLivro(Livro livro) {

        try {
            ut.begin();

            em.merge(livro);

            ut.commit();
        } catch (Throwable e) {
            try {
                ut.rollback();
                e.printStackTrace();
                
            } catch (Throwable e1) {
            }
            
            throw new DataAccessException();
        }
    }

    @Override
    public List<Livro> obterLivros(String titulo) {

        Query qy = em.createNamedQuery("Livro.findByTitulo");
        qy.setParameter("titulo", "%" + titulo + "%");

        return qy.getResultList();
    }

    @Override
    public List<Livro> obterLivros() {
        Query qy = em.createQuery("Select l From Livro l Order by l.titulo asc");
        return qy.getResultList();
    }

    @Override
    public List<LivroTipo> obterLivrosTipo() {
        Query qy = em.createNamedQuery("LivroTipo.findAll");
        return qy.getResultList();
    }

    @Override
    public List<LivroTipo> obterLivrosTipo(String descricao) {
        Query qy = em.createNamedQuery("LivroTipo.findByDescricao");
        qy.setParameter("descricao", "%" + descricao + "%");
        return qy.getResultList();
    }

    @Override
    public LivroTipo salvarLivroTipo(LivroTipo livroTipo) {

        try {
            ut.begin();

            livroTipo = (LivroTipo) em.merge(livroTipo);

            ut.commit();
        } catch (Throwable e) {
            try {
                ut.rollback();
            } catch (Throwable e1) {
            }
        }

        return livroTipo;
    }

    @Override
    public LivroTipo obterLivroTipo(Long id) {
        return em.find(LivroTipo.class, id);
    }

    @Override
    public Usuario salvarUsuario(Usuario usuario) {

        try {

            System.out.println("Usuario =" + usuario.getId());

            ut.begin();

            em.merge(usuario);

            ut.commit();
        } catch (Throwable e) {
            try {
                ut.rollback();
            } catch (Throwable e1) {

            }
        }
        return usuario;
    }

    @Override
    public List<Usuario> ObtemUsuarios(String nome) {
        Query qy = em.createNamedQuery("Usuario.findAllByNome");
        qy.setParameter("nome", "%" + nome + "%");
        return qy.getResultList();

    }

    @Override
    public boolean verifivarLoginSenha(String login, String senha) {
        Query qy = em.createNamedQuery("Usuario.findByLoginSenha");
        qy.setParameter("login", login);
        qy.setParameter("senha", senha);
        List<Usuario> l = qy.getResultList();
        return l != null && l.size() == 1;

    }

    @Override
    public List<Usuario> ObtemTodosUsuarios() {

        Query qy = em.createNamedQuery("Usuario.findAll");

        return qy.getResultList();

    }

    @Override
    public Usuario obterUsuario(long id) {
        return em.find(Usuario.class, id);
    }

    @Override
    public boolean deletarUsuario(Usuario usuario) {
        if (usuario != null) {

            try {
                ut.begin();

                if (!em.contains(usuario)) {
                    usuario = em.find(Usuario.class, usuario.getId());
                }

                em.remove(usuario);

                ut.commit();
                return true;
            } catch (Throwable e) {
                try {
                    e.printStackTrace();
                    ut.rollback();
                } catch (Throwable e1) {
                    e1.printStackTrace();
                    return false;
                }
            }
        }
        return false;

    }

}
